Mapping Child Mortality and Orphanhood Trends: A UNICEF Perspective

Spring 2025 BAA1030 Data Analytics & Story Telling (20074)

Name : Praghya Prakhar

Student ID: A00039396

Programme: Data Analytics

Executive Summary

This report explores global disparities in child mortality and health inequalities, focusing on data provided by UNICEF. It integrates key indicators such as child mortality rates, health access, and education, highlighting the disparities between high-income and low-income countries. The goal is to raise awareness about the urgent need for intervention in countries with the highest mortality rates.

Introduction

Child mortality remains a major issue worldwide, particularly in low-income nations. UNICEF focuses on improving healthcare, access to clean water, and education to reduce these inequalities. This report analyzes the factors contributing to high mortality rates and suggests potential policy actions to support children’s survival and well-being.

Global Child Mortality and Health Inequalities

Child mortality remains a major issue worldwide, particularly in low-income nations.
UNICEF focuses on saving children’s lives by improving access to healthcare, clean water, and education.

Key Insights:

  • Child mortality rates are highest in Sub-Saharan Africa.
  • Economic development strongly impacts health outcomes.
  • Progress has been made, but disparities remain wide.
Code
import pandas as pd
import geopandas as gpd
from plotnine import *
import matplotlib.pyplot as plt
import geodatasets
import plotly.express as px

# Load the CSV files
indicator1 = pd.read_csv("unicef_indicator_1.csv")
indicator2 = pd.read_csv("unicef_indicator_2.csv")
metadata = pd.read_csv("unicef_metadata.csv")

World Child Mortality Map

Code
# Load world map
# Prepare world map
world = gpd.read_file(r'C:\Users\hp\Desktop\UNICEF-Report\data\ne_110m_admin_0_countries\ne_110m_admin_0_countries.shp')

world = world.rename(columns={"NAME_EN": "Country"})

# Merge mortality data
mortality_2020 = indicator1[indicator1['time_period'] == 2020]


# Only keep necessary columns (mortality 2020)
mortality_2020 = indicator1[indicator1['time_period'] == 2020]

# Now plot using Plotly
fig = px.choropleth(
    mortality_2020,
    locations="alpha_3_code",  # this must exist in your indicator1 dataset
    color="obs_value",
    hover_name="country",
    color_continuous_scale="Reds",
    title="Global Child Mortality Rates (2020)",
    labels={'obs_value': 'Mortality Rate (per 1000 births)'}
)

fig.update_layout(
    geo=dict(showframe=False, showcoastlines=False),
    margin={"r":0,"t":50,"l":0,"b":0}
)
fig.show()

Top 10 Countries

Code
# Filter data for 2020
mortality_2020 = indicator1[indicator1['time_period'] == 2020]

# Sort by 'obs_value' (mortality rate)
top10 = mortality_2020.sort_values(by="obs_value", ascending=False).head(10)

# Create an interactive horizontal bar chart
fig = px.bar(
    top10,
    x='obs_value',
    y='country',
    orientation='h',    # 👈 Horizontal bars
    color='country',
    color_discrete_sequence=[
        "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", 
        "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", 
        "#bcbd22", "#17becf"
    ],
    title="Top 10 Countries by Child Mortality Rate (2020)",
    labels={'obs_value': 'Mortality Rate per 1000 births', 'country': 'Country'}
)

# Flip y-axis for better reading
fig.update_layout(
    yaxis={'categoryorder': 'total ascending'},
    xaxis_title="Mortality Rate per 1000 births",
    yaxis_title="Country",
    showlegend=False
)

fig.show()

GDP vs Mortality

Code
merged = pd.merge(indicator1, indicator2, on=['country', 'time_period'], suffixes=("_mortality", "_gdp"))

# Now plot with a slider across time_period (year)
fig = px.scatter(
    merged,
    x='obs_value_gdp',
    y='obs_value_mortality',
    animation_frame='time_period',   
    color='obs_value_mortality',
    color_continuous_scale="Viridis",
    title="GDP vs Child Mortality Rate Over Time",
    labels={
        'obs_value_gdp': 'GDP per Capita',
        'obs_value_mortality': 'Mortality Rate (per 1000 births)',
        'time_period': 'Year'
    },
    hover_name='country',
    size_max=45
)

fig.update_layout(
    xaxis_title="GDP per Capita",
    yaxis_title="Mortality Rate per 1000 births",
    showlegend=False
)

fig.show()

Global Trend Over Time

Code
# Group by 'country' and 'year'
country_mortality = indicator1.groupby(['country', 'time_period'])['obs_value'].mean().reset_index()

fig = px.line(
    country_mortality,
    x='time_period',
    y='obs_value',
    animation_frame='country', 
    title="Child Mortality Over Time by Country (Use Slider Below)",
    labels={'time_period': 'Year', 'obs_value': 'Mortality Rate (per 1000 births)', 'country': 'Country'},
)

fig.update_layout(
    xaxis_title="Year",
    yaxis_title="Mortality Rate",
    hovermode="x unified",
    showlegend=False
)

fig.show()

Conclusion

This report presents an in-depth analysis of global child mortality and related health inequalities, emphasizing the importance of improved access to healthcare, clean water, and education. By examining key indicators such as GDP, mortality rates, and orphanhood trends, we observe a significant disparity between high-income and low-income countries. Interventions are urgently needed in regions with high mortality rates to reduce these disparities.